const WordVector = require("../model/wordvector")

/**
 * 计算两个词向量的距离
 * @param {WordVector} W1 
 * @param {WordVector} W2 
 */
const CalculateWordDistance = (W1,W2) => {
    // methods 1 欧式距离
    let wl1 = W1.GetVector()
    let wl2 = W2.GetVector()
    // let sum = 0;
    // for(let i =0;i<wl1.length;i++){
    //     sum += Math.pow(wl1[i]-wl2[i],2)
    // }
    // return Math.sqrt(sum);

    // methods 2 余弦距离
    // 余弦距离体现的是方向上的相对差异（更合适）
    // 余弦距离越大，则表现出来两个次之间越相关，而余弦距离越接近0，则两个词间的差异越大
    // 类似于相关系数
    let pow1 = pow2  = cor = 0;
    let len = wl1.length;
    for(let i=0;i<len;i++){
        pow1 += Math.pow(wl1[i],2)
        pow2 += Math.pow(wl2[i],2)
        cor += wl1[i]*wl2[i]
    }
    // 余弦值
    let cos = cor / Math.sqrt(pow1*pow2)
    // 余弦值取值范围是[0,1]
    // 1-余弦距离 是的原本的相关变成了 差异
    return 1-(cos)
}

module.exports = {
    CalculateWordDistance
}